package com.zhuhjay.common.redis.context;

import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.script.DefaultRedisScript;

/**
 * 存储 LUA 脚本的上下文
 * @author ZhuHJay
 * @date 2023/3/20 11:06
 */
public class RedisScriptContext {

    /** Lua 脚本存储目录 */
    private static final String SCRIPT_DIR = "lua/";
    /** API 限流脚本 */
    @Deprecated
    public static final DefaultRedisScript<Long> API_LIMITER_SCRIPT;
    /** API 黑名单限流脚本(改进, 提高了10倍以上的QPS) */
    public static final DefaultRedisScript<Long> API_BLACK_LIMITER_SCRIPT;

    static {
        // api 限流脚本
        API_LIMITER_SCRIPT = register(Long.class, "apiLimiter.lua");
        // api 黑名单限流脚本
        API_BLACK_LIMITER_SCRIPT = register(Long.class, "api_black_limiter.lua");
    }

    /**
     * 注册脚本
     * @param resultType 脚本的返回值
     * @param fileName 脚本 key
     * @param <T> 泛型
     */
    private static <T> DefaultRedisScript<T> register(Class<T> resultType, String fileName) {
        DefaultRedisScript<T> script = new DefaultRedisScript<>();
        script.setResultType(resultType);
        script.setLocation(new ClassPathResource(SCRIPT_DIR + fileName));
        return script;
    }

}
